package com.zjb.demo.system.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.zjb.demo.system.domain.SysDept;
import com.zjb.demo.system.domain.dto.SysDeptPageQueryDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

import static com.zjb.demo.system.domain.table.SysDeptTableDef.SYS_DEPT;

/**
 * @author 庄佳彬
 * @since 2023/12/27 22:37
 */
@Mapper
public interface SysDeptMapper extends BaseMapper<SysDept> {
    /**
     * 根据部门ID查询普通子部门（正常状态数量）
     *
     * @param deptId 部门ID
     * @return 数量
     */
    @Select("select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)")
    long selectNormalChildrenDeptById(@Param("deptId") Long deptId);

    /**
     * 根据角色ID和是否严格检查部门列表
     *
     * @param roleId            角色ID
     * @param deptCheckStrictly 是否严格检查部门
     * @return 部门列表
     */
    default List<Long> selectDeptListByRoleId(Long roleId, boolean deptCheckStrictly) {
        return QueryChain.of(this)
                .select(SYS_DEPT.DEPT_ID)
                .from(SYS_DEPT)
                .objListAs(Long.class);
    }

    /**
     * 按条件查询部门列表
     *
     * @param dept 部门条件
     * @return 部门列表
     */
    default List<SysDept> list(SysDeptPageQueryDto dept) {
        return getQueryChain(dept).list();
    }

    private QueryChain<SysDept> getQueryChain(SysDeptPageQueryDto dept) {
        return QueryChain.of(this)
                .select(SYS_DEPT.DEPT_ID,
                        SYS_DEPT.PARENT_ID,
                        SYS_DEPT.ANCESTORS,
                        SYS_DEPT.DEPT_NAME,
                        SYS_DEPT.ORDER_NUM,
                        SYS_DEPT.LEADER,
                        SYS_DEPT.PHONE,
                        SYS_DEPT.EMAIL,
                        SYS_DEPT.STATUS,
                        SYS_DEPT.DEL_FLAG,
                        SYS_DEPT.CREATE_BY,
                        SYS_DEPT.CREATE_TIME)
                .from(SYS_DEPT)
                .where(SYS_DEPT.DEPT_ID.eq(dept.deptId()))
                .and(SYS_DEPT.PARENT_ID.eq(dept.parentId()))
                .and(SYS_DEPT.DEPT_NAME.like(dept.deptName()))
                .and(SYS_DEPT.STATUS.eq(dept.status()))
                .orderBy(SYS_DEPT.PARENT_ID.asc(), SYS_DEPT.ORDER_NUM.asc());
    }

    /**
     * 根据指定的SysDeptPageQueryDto查询分页查询部门列表
     *
     * @param dto 分页查询条件对象
     * @return 分页结果
     */
    default Page<SysDept> pageList(SysDeptPageQueryDto dto) {
        return getQueryChain(dto).page(dto.page());
    }

}
